package org.origin.centre.support.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;

import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;

/**
 * YAML配置文件工具类
 *
 * @author ferret
 * @version 2024-05-08
 */
@SuppressWarnings("unused")
public final class YmlUtil {
    private static final Logger logger = LoggerFactory.getLogger(YmlUtil.class);

    /**
     * 加载YAML配置文件。
     *
     * @param paths 配置文件路径数组
     * @return PropertySourcesPlaceholderConfigurer 配置文件加载器
     */
    public static Optional<PropertySourcesPlaceholderConfigurer> loadYml(String... paths) {
        if (paths == null || paths.length == 0) {
            // 当没有提供路径时，可以选择返回一个空的配置器或直接返回null，这里根据具体需求决定。
            return Optional.empty();
        }

        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
        YamlPropertiesFactoryBean yml = new YamlPropertiesFactoryBean();

        try {
            // 使用Java 8的特性简化资源数组的创建
            ClassPathResource[] resources = Arrays.stream(paths)
                    .map(ClassPathResource::new)
                    .toArray(ClassPathResource[]::new);

            yml.setResources(resources);
            // 对可能抛出的异常进行捕获处理
            configurer.setProperties(Objects.requireNonNull(yml.getObject()));
        } catch (Exception e) {
            // 在实际应用中，可以根据需要记录日志或抛出自定义异常
            logger.error("加载YAML配置文件失败：", e);
            return Optional.empty();
        }
        return Optional.of(configurer);
    }
}
